package com.ilancuo.template.singleton;

/**
 * 静态内部类法
 * 
 * 由于外部类的加载并不会导致内部类立即加载，只有当调用getInstance的时候才会加载内部类，
 * 所以实现类延迟初始化。由于类只会被加载一次，并且类加载也是线程安全的，所以满足我们所有的需求。
 * 
 * Singleton1和Singleton2共同的缺点：
 * 都需要额外的工作(Serializable、transient、readResolve())来实现序列化，
 * 否则每次反序列化一个序列化的对象实例时都会创建一个新的实例。
 * 可能会有人使用反射强行调用我们的私有构造器（如果要避免这种情况，可以修改构造器，让它在创建第二个实例的时候抛异常）。
 * 
 * @author ilancuo
 * 
 */
public class SingletonWithInnerClass {

	private SingletonWithInnerClass() {

	}

	private static class SingletonHolder {
		private static SingletonWithInnerClass singleton = new SingletonWithInnerClass();
	}

	public static SingletonWithInnerClass getInstance() {
		return SingletonHolder.singleton;
	}
}